//===----------------------------------------------------------------------===//
//
// This source file is part of the Soto for AWS open source project
//
// Copyright (c) 2017-2024 the Soto project authors
// Licensed under Apache License v2.0
//
// See LICENSE.txt for license information
// See CONTRIBUTORS.txt for the list of Soto project authors
//
// SPDX-License-Identifier: Apache-2.0
//
//===----------------------------------------------------------------------===//

// THIS FILE IS AUTOMATICALLY GENERATED by https://github.com/soto-project/soto-codegenerator.
// DO NOT EDIT.

#if canImport(FoundationEssentials)
import FoundationEssentials
#else
import Foundation
#endif
@_exported import SotoCore

/// Service object for interacting with AWS MigrationHub service.
///
/// The AWS Migration Hub API methods help to obtain server and application migration status and integrate your resource-specific migration tool by providing a programmatic interface to Migration Hub. Remember that you must set your AWS Migration Hub home region before you call any of these APIs, or a HomeRegionNotSetException error will be returned. Also, you must make the API calls while in your home region.
public struct MigrationHub: AWSService {
    // MARK: Member variables

    /// Client used for communication with AWS
    public let client: AWSClient
    /// Service configuration
    public let config: AWSServiceConfig

    // MARK: Initialization

    /// Initialize the MigrationHub client
    /// - parameters:
    ///     - client: AWSClient used to process requests
    ///     - region: Region of server you want to communicate with. This will override the partition parameter.
    ///     - partition: AWS partition where service resides, standard (.aws), china (.awscn), government (.awsusgov).
    ///     - endpoint: Custom endpoint URL to use instead of standard AWS servers
    ///     - middleware: Middleware chain used to edit requests before they are sent and responses before they are decoded 
    ///     - timeout: Timeout value for HTTP requests
    ///     - byteBufferAllocator: Allocator for ByteBuffers
    ///     - options: Service options
    public init(
        client: AWSClient,
        region: SotoCore.Region? = nil,
        partition: AWSPartition = .aws,
        endpoint: String? = nil,
        middleware: AWSMiddlewareProtocol? = nil,
        timeout: TimeAmount? = nil,
        byteBufferAllocator: ByteBufferAllocator = ByteBufferAllocator(),
        options: AWSServiceConfig.Options = []
    ) {
        self.client = client
        self.config = AWSServiceConfig(
            region: region,
            partition: region?.partition ?? partition,
            amzTarget: "AWSMigrationHub",
            serviceName: "MigrationHub",
            serviceIdentifier: "mgh",
            serviceProtocol: .json(version: "1.1"),
            apiVersion: "2017-05-31",
            endpoint: endpoint,
            errorType: MigrationHubErrorType.self,
            middleware: middleware,
            timeout: timeout,
            byteBufferAllocator: byteBufferAllocator,
            options: options
        )
    }





    // MARK: API Calls

    /// Associates a created artifact of an AWS cloud resource, the target receiving the migration, with the migration task performed by a migration tool. This API has the following traits:   Migration tools can call the AssociateCreatedArtifact operation to indicate which AWS artifact is associated with a migration task.   The created artifact name must be provided in ARN (Amazon Resource Name) format which will contain information about type and region; for example: arn:aws:ec2:us-east-1:488216288981:image/ami-6d0ba87b.   Examples of the AWS resource behind the created artifact are, AMI's, EC2 instance, or DMS endpoint, etc.
    @Sendable
    @inlinable
    public func associateCreatedArtifact(_ input: AssociateCreatedArtifactRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> AssociateCreatedArtifactResult {
        try await self.client.execute(
            operation: "AssociateCreatedArtifact", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Associates a created artifact of an AWS cloud resource, the target receiving the migration, with the migration task performed by a migration tool. This API has the following traits:   Migration tools can call the AssociateCreatedArtifact operation to indicate which AWS artifact is associated with a migration task.   The created artifact name must be provided in ARN (Amazon Resource Name) format which will contain information about type and region; for example: arn:aws:ec2:us-east-1:488216288981:image/ami-6d0ba87b.   Examples of the AWS resource behind the created artifact are, AMI's, EC2 instance, or DMS endpoint, etc.
    ///
    /// Parameters:
    ///   - createdArtifact: An ARN of the AWS resource related to the migration (e.g., AMI, EC2 instance, RDS instance, etc.)
    ///   - dryRun: Optional boolean flag to indicate whether any effect should take place. Used to test if the caller has permission to make the call.
    ///   - migrationTaskName: Unique identifier that references the migration task. Do not store personal data in this field.
    ///   - progressUpdateStream: The name of the ProgressUpdateStream.
    ///   - logger: Logger use during operation
    @inlinable
    public func associateCreatedArtifact(
        createdArtifact: CreatedArtifact,
        dryRun: Bool? = nil,
        migrationTaskName: String,
        progressUpdateStream: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> AssociateCreatedArtifactResult {
        let input = AssociateCreatedArtifactRequest(
            createdArtifact: createdArtifact, 
            dryRun: dryRun, 
            migrationTaskName: migrationTaskName, 
            progressUpdateStream: progressUpdateStream
        )
        return try await self.associateCreatedArtifact(input, logger: logger)
    }

    /// Associates a discovered resource ID from Application Discovery Service with a migration task.
    @Sendable
    @inlinable
    public func associateDiscoveredResource(_ input: AssociateDiscoveredResourceRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> AssociateDiscoveredResourceResult {
        try await self.client.execute(
            operation: "AssociateDiscoveredResource", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Associates a discovered resource ID from Application Discovery Service with a migration task.
    ///
    /// Parameters:
    ///   - discoveredResource: Object representing a Resource.
    ///   - dryRun: Optional boolean flag to indicate whether any effect should take place. Used to test if the caller has permission to make the call.
    ///   - migrationTaskName: The identifier given to the MigrationTask. Do not store personal data in this field.
    ///   - progressUpdateStream: The name of the ProgressUpdateStream.
    ///   - logger: Logger use during operation
    @inlinable
    public func associateDiscoveredResource(
        discoveredResource: DiscoveredResource,
        dryRun: Bool? = nil,
        migrationTaskName: String,
        progressUpdateStream: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> AssociateDiscoveredResourceResult {
        let input = AssociateDiscoveredResourceRequest(
            discoveredResource: discoveredResource, 
            dryRun: dryRun, 
            migrationTaskName: migrationTaskName, 
            progressUpdateStream: progressUpdateStream
        )
        return try await self.associateDiscoveredResource(input, logger: logger)
    }

    /// Associates a source resource with a migration task. For example, the source resource can be a source server, an application, or a migration wave.
    @Sendable
    @inlinable
    public func associateSourceResource(_ input: AssociateSourceResourceRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> AssociateSourceResourceResult {
        try await self.client.execute(
            operation: "AssociateSourceResource", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Associates a source resource with a migration task. For example, the source resource can be a source server, an application, or a migration wave.
    ///
    /// Parameters:
    ///   - dryRun: This is an optional parameter that you can use to test whether the call will succeed. Set this parameter to true to verify that you have the permissions that are required to make the call, and that you have specified the other parameters in the call correctly.
    ///   - migrationTaskName: A unique identifier that references the migration task. Do not include sensitive data in this field.
    ///   - progressUpdateStream: The name of the progress-update stream, which is used for access control as well as a namespace for migration-task names that is implicitly linked to your AWS account. The progress-update stream must uniquely identify the migration tool as it is used for all updates made by the tool; however, it does not need to be unique for each AWS account because it is scoped to the AWS account.
    ///   - sourceResource: The source resource that you want to associate.
    ///   - logger: Logger use during operation
    @inlinable
    public func associateSourceResource(
        dryRun: Bool? = nil,
        migrationTaskName: String,
        progressUpdateStream: String,
        sourceResource: SourceResource,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> AssociateSourceResourceResult {
        let input = AssociateSourceResourceRequest(
            dryRun: dryRun, 
            migrationTaskName: migrationTaskName, 
            progressUpdateStream: progressUpdateStream, 
            sourceResource: sourceResource
        )
        return try await self.associateSourceResource(input, logger: logger)
    }

    /// Creates a progress update stream which is an AWS resource used for access control as well as a namespace for migration task names that is implicitly linked to your AWS account. It must uniquely identify the migration tool as it is used for all updates made by the tool; however, it does not need to be unique for each AWS account because it is scoped to the AWS account.
    @Sendable
    @inlinable
    public func createProgressUpdateStream(_ input: CreateProgressUpdateStreamRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> CreateProgressUpdateStreamResult {
        try await self.client.execute(
            operation: "CreateProgressUpdateStream", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Creates a progress update stream which is an AWS resource used for access control as well as a namespace for migration task names that is implicitly linked to your AWS account. It must uniquely identify the migration tool as it is used for all updates made by the tool; however, it does not need to be unique for each AWS account because it is scoped to the AWS account.
    ///
    /// Parameters:
    ///   - dryRun: Optional boolean flag to indicate whether any effect should take place. Used to test if the caller has permission to make the call.
    ///   - progressUpdateStreamName: The name of the ProgressUpdateStream. Do not store personal data in this field.
    ///   - logger: Logger use during operation
    @inlinable
    public func createProgressUpdateStream(
        dryRun: Bool? = nil,
        progressUpdateStreamName: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> CreateProgressUpdateStreamResult {
        let input = CreateProgressUpdateStreamRequest(
            dryRun: dryRun, 
            progressUpdateStreamName: progressUpdateStreamName
        )
        return try await self.createProgressUpdateStream(input, logger: logger)
    }

    /// Deletes a progress update stream, including all of its tasks, which was previously created as an AWS resource used for access control. This API has the following traits:   The only parameter needed for DeleteProgressUpdateStream is the stream name (same as a CreateProgressUpdateStream call).   The call will return, and a background process will asynchronously delete the stream and all of its resources (tasks, associated resources, resource attributes, created artifacts).   If the stream takes time to be deleted, it might still show up on a ListProgressUpdateStreams call.    CreateProgressUpdateStream, ImportMigrationTask, NotifyMigrationTaskState, and all Associate[*] APIs related to the tasks belonging to the stream will throw "InvalidInputException" if the stream of the same name is in the process of being deleted.   Once the stream and all of its resources are deleted, CreateProgressUpdateStream for a stream of the same name will succeed, and that stream will be an entirely new logical resource (without any resources associated with the old stream).
    @Sendable
    @inlinable
    public func deleteProgressUpdateStream(_ input: DeleteProgressUpdateStreamRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> DeleteProgressUpdateStreamResult {
        try await self.client.execute(
            operation: "DeleteProgressUpdateStream", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Deletes a progress update stream, including all of its tasks, which was previously created as an AWS resource used for access control. This API has the following traits:   The only parameter needed for DeleteProgressUpdateStream is the stream name (same as a CreateProgressUpdateStream call).   The call will return, and a background process will asynchronously delete the stream and all of its resources (tasks, associated resources, resource attributes, created artifacts).   If the stream takes time to be deleted, it might still show up on a ListProgressUpdateStreams call.    CreateProgressUpdateStream, ImportMigrationTask, NotifyMigrationTaskState, and all Associate[*] APIs related to the tasks belonging to the stream will throw "InvalidInputException" if the stream of the same name is in the process of being deleted.   Once the stream and all of its resources are deleted, CreateProgressUpdateStream for a stream of the same name will succeed, and that stream will be an entirely new logical resource (without any resources associated with the old stream).
    ///
    /// Parameters:
    ///   - dryRun: Optional boolean flag to indicate whether any effect should take place. Used to test if the caller has permission to make the call.
    ///   - progressUpdateStreamName: The name of the ProgressUpdateStream. Do not store personal data in this field.
    ///   - logger: Logger use during operation
    @inlinable
    public func deleteProgressUpdateStream(
        dryRun: Bool? = nil,
        progressUpdateStreamName: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> DeleteProgressUpdateStreamResult {
        let input = DeleteProgressUpdateStreamRequest(
            dryRun: dryRun, 
            progressUpdateStreamName: progressUpdateStreamName
        )
        return try await self.deleteProgressUpdateStream(input, logger: logger)
    }

    /// Gets the migration status of an application.
    @Sendable
    @inlinable
    public func describeApplicationState(_ input: DescribeApplicationStateRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> DescribeApplicationStateResult {
        try await self.client.execute(
            operation: "DescribeApplicationState", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Gets the migration status of an application.
    ///
    /// Parameters:
    ///   - applicationId: The configurationId in Application Discovery Service that uniquely identifies the grouped application.
    ///   - logger: Logger use during operation
    @inlinable
    public func describeApplicationState(
        applicationId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> DescribeApplicationStateResult {
        let input = DescribeApplicationStateRequest(
            applicationId: applicationId
        )
        return try await self.describeApplicationState(input, logger: logger)
    }

    /// Retrieves a list of all attributes associated with a specific migration task.
    @Sendable
    @inlinable
    public func describeMigrationTask(_ input: DescribeMigrationTaskRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> DescribeMigrationTaskResult {
        try await self.client.execute(
            operation: "DescribeMigrationTask", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Retrieves a list of all attributes associated with a specific migration task.
    ///
    /// Parameters:
    ///   - migrationTaskName: The identifier given to the MigrationTask. Do not store personal data in this field.
    ///   - progressUpdateStream: The name of the ProgressUpdateStream.
    ///   - logger: Logger use during operation
    @inlinable
    public func describeMigrationTask(
        migrationTaskName: String,
        progressUpdateStream: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> DescribeMigrationTaskResult {
        let input = DescribeMigrationTaskRequest(
            migrationTaskName: migrationTaskName, 
            progressUpdateStream: progressUpdateStream
        )
        return try await self.describeMigrationTask(input, logger: logger)
    }

    /// Disassociates a created artifact of an AWS resource with a migration task performed by a migration tool that was previously associated. This API has the following traits:   A migration user can call the DisassociateCreatedArtifacts operation to disassociate a created AWS Artifact from a migration task.   The created artifact name must be provided in ARN (Amazon Resource Name) format which will contain information about type and region; for example: arn:aws:ec2:us-east-1:488216288981:image/ami-6d0ba87b.   Examples of the AWS resource behind the created artifact are, AMI's, EC2 instance, or RDS instance, etc.
    @Sendable
    @inlinable
    public func disassociateCreatedArtifact(_ input: DisassociateCreatedArtifactRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> DisassociateCreatedArtifactResult {
        try await self.client.execute(
            operation: "DisassociateCreatedArtifact", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Disassociates a created artifact of an AWS resource with a migration task performed by a migration tool that was previously associated. This API has the following traits:   A migration user can call the DisassociateCreatedArtifacts operation to disassociate a created AWS Artifact from a migration task.   The created artifact name must be provided in ARN (Amazon Resource Name) format which will contain information about type and region; for example: arn:aws:ec2:us-east-1:488216288981:image/ami-6d0ba87b.   Examples of the AWS resource behind the created artifact are, AMI's, EC2 instance, or RDS instance, etc.
    ///
    /// Parameters:
    ///   - createdArtifactName: An ARN of the AWS resource related to the migration (e.g., AMI, EC2 instance, RDS instance, etc.)
    ///   - dryRun: Optional boolean flag to indicate whether any effect should take place. Used to test if the caller has permission to make the call.
    ///   - migrationTaskName: Unique identifier that references the migration task to be disassociated with the artifact. Do not store personal data in this field.
    ///   - progressUpdateStream: The name of the ProgressUpdateStream.
    ///   - logger: Logger use during operation
    @inlinable
    public func disassociateCreatedArtifact(
        createdArtifactName: String,
        dryRun: Bool? = nil,
        migrationTaskName: String,
        progressUpdateStream: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> DisassociateCreatedArtifactResult {
        let input = DisassociateCreatedArtifactRequest(
            createdArtifactName: createdArtifactName, 
            dryRun: dryRun, 
            migrationTaskName: migrationTaskName, 
            progressUpdateStream: progressUpdateStream
        )
        return try await self.disassociateCreatedArtifact(input, logger: logger)
    }

    /// Disassociate an Application Discovery Service discovered resource from a migration task.
    @Sendable
    @inlinable
    public func disassociateDiscoveredResource(_ input: DisassociateDiscoveredResourceRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> DisassociateDiscoveredResourceResult {
        try await self.client.execute(
            operation: "DisassociateDiscoveredResource", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Disassociate an Application Discovery Service discovered resource from a migration task.
    ///
    /// Parameters:
    ///   - configurationId: ConfigurationId of the Application Discovery Service resource to be disassociated.
    ///   - dryRun: Optional boolean flag to indicate whether any effect should take place. Used to test if the caller has permission to make the call.
    ///   - migrationTaskName: The identifier given to the MigrationTask. Do not store personal data in this field.
    ///   - progressUpdateStream: The name of the ProgressUpdateStream.
    ///   - logger: Logger use during operation
    @inlinable
    public func disassociateDiscoveredResource(
        configurationId: String,
        dryRun: Bool? = nil,
        migrationTaskName: String,
        progressUpdateStream: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> DisassociateDiscoveredResourceResult {
        let input = DisassociateDiscoveredResourceRequest(
            configurationId: configurationId, 
            dryRun: dryRun, 
            migrationTaskName: migrationTaskName, 
            progressUpdateStream: progressUpdateStream
        )
        return try await self.disassociateDiscoveredResource(input, logger: logger)
    }

    /// Removes the association between a source resource and a migration task.
    @Sendable
    @inlinable
    public func disassociateSourceResource(_ input: DisassociateSourceResourceRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> DisassociateSourceResourceResult {
        try await self.client.execute(
            operation: "DisassociateSourceResource", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Removes the association between a source resource and a migration task.
    ///
    /// Parameters:
    ///   - dryRun: This is an optional parameter that you can use to test whether the call will succeed. Set this parameter to true to verify that you have the permissions that are required to make the call, and that you have specified the other parameters in the call correctly.
    ///   - migrationTaskName: A unique identifier that references the migration task. Do not include sensitive data in this field.
    ///   - progressUpdateStream: The name of the progress-update stream, which is used for access control as well as a namespace for migration-task names that is implicitly linked to your AWS account. The progress-update stream must uniquely identify the migration tool as it is used for all updates made by the tool; however, it does not need to be unique for each AWS account because it is scoped to the AWS account.
    ///   - sourceResourceName: The name that was specified for the source resource.
    ///   - logger: Logger use during operation
    @inlinable
    public func disassociateSourceResource(
        dryRun: Bool? = nil,
        migrationTaskName: String,
        progressUpdateStream: String,
        sourceResourceName: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> DisassociateSourceResourceResult {
        let input = DisassociateSourceResourceRequest(
            dryRun: dryRun, 
            migrationTaskName: migrationTaskName, 
            progressUpdateStream: progressUpdateStream, 
            sourceResourceName: sourceResourceName
        )
        return try await self.disassociateSourceResource(input, logger: logger)
    }

    /// Registers a new migration task which represents a server, database, etc., being migrated to AWS by a migration tool. This API is a prerequisite to calling the NotifyMigrationTaskState API as the migration tool must first register the migration task with Migration Hub.
    @Sendable
    @inlinable
    public func importMigrationTask(_ input: ImportMigrationTaskRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> ImportMigrationTaskResult {
        try await self.client.execute(
            operation: "ImportMigrationTask", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Registers a new migration task which represents a server, database, etc., being migrated to AWS by a migration tool. This API is a prerequisite to calling the NotifyMigrationTaskState API as the migration tool must first register the migration task with Migration Hub.
    ///
    /// Parameters:
    ///   - dryRun: Optional boolean flag to indicate whether any effect should take place. Used to test if the caller has permission to make the call.
    ///   - migrationTaskName: Unique identifier that references the migration task. Do not store personal data in this field.
    ///   - progressUpdateStream: The name of the ProgressUpdateStream. >
    ///   - logger: Logger use during operation
    @inlinable
    public func importMigrationTask(
        dryRun: Bool? = nil,
        migrationTaskName: String,
        progressUpdateStream: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> ImportMigrationTaskResult {
        let input = ImportMigrationTaskRequest(
            dryRun: dryRun, 
            migrationTaskName: migrationTaskName, 
            progressUpdateStream: progressUpdateStream
        )
        return try await self.importMigrationTask(input, logger: logger)
    }

    /// Lists all the migration statuses for your applications. If you use the optional ApplicationIds parameter, only the migration statuses for those applications will be returned.
    @Sendable
    @inlinable
    public func listApplicationStates(_ input: ListApplicationStatesRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> ListApplicationStatesResult {
        try await self.client.execute(
            operation: "ListApplicationStates", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Lists all the migration statuses for your applications. If you use the optional ApplicationIds parameter, only the migration statuses for those applications will be returned.
    ///
    /// Parameters:
    ///   - applicationIds: The configurationIds from the Application Discovery Service that uniquely identifies your applications.
    ///   - maxResults: Maximum number of results to be returned per page.
    ///   - nextToken: If a NextToken was returned by a previous call, there are more results available. To retrieve the next page of results, make the call again using the returned token in NextToken.
    ///   - logger: Logger use during operation
    @inlinable
    public func listApplicationStates(
        applicationIds: [String]? = nil,
        maxResults: Int? = nil,
        nextToken: String? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> ListApplicationStatesResult {
        let input = ListApplicationStatesRequest(
            applicationIds: applicationIds, 
            maxResults: maxResults, 
            nextToken: nextToken
        )
        return try await self.listApplicationStates(input, logger: logger)
    }

    /// Lists the created artifacts attached to a given migration task in an update stream. This API has the following traits:   Gets the list of the created artifacts while migration is taking place.   Shows the artifacts created by the migration tool that was associated by the AssociateCreatedArtifact API.    Lists created artifacts in a paginated interface.
    @Sendable
    @inlinable
    public func listCreatedArtifacts(_ input: ListCreatedArtifactsRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> ListCreatedArtifactsResult {
        try await self.client.execute(
            operation: "ListCreatedArtifacts", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Lists the created artifacts attached to a given migration task in an update stream. This API has the following traits:   Gets the list of the created artifacts while migration is taking place.   Shows the artifacts created by the migration tool that was associated by the AssociateCreatedArtifact API.    Lists created artifacts in a paginated interface.
    ///
    /// Parameters:
    ///   - maxResults: Maximum number of results to be returned per page.
    ///   - migrationTaskName: Unique identifier that references the migration task. Do not store personal data in this field.
    ///   - nextToken: If a NextToken was returned by a previous call, there are more results available. To retrieve the next page of results, make the call again using the returned token in NextToken.
    ///   - progressUpdateStream: The name of the ProgressUpdateStream.
    ///   - logger: Logger use during operation
    @inlinable
    public func listCreatedArtifacts(
        maxResults: Int? = nil,
        migrationTaskName: String,
        nextToken: String? = nil,
        progressUpdateStream: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> ListCreatedArtifactsResult {
        let input = ListCreatedArtifactsRequest(
            maxResults: maxResults, 
            migrationTaskName: migrationTaskName, 
            nextToken: nextToken, 
            progressUpdateStream: progressUpdateStream
        )
        return try await self.listCreatedArtifacts(input, logger: logger)
    }

    /// Lists discovered resources associated with the given MigrationTask.
    @Sendable
    @inlinable
    public func listDiscoveredResources(_ input: ListDiscoveredResourcesRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> ListDiscoveredResourcesResult {
        try await self.client.execute(
            operation: "ListDiscoveredResources", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Lists discovered resources associated with the given MigrationTask.
    ///
    /// Parameters:
    ///   - maxResults: The maximum number of results returned per page.
    ///   - migrationTaskName: The name of the MigrationTask. Do not store personal data in this field.
    ///   - nextToken: If a NextToken was returned by a previous call, there are more results available. To retrieve the next page of results, make the call again using the returned token in NextToken.
    ///   - progressUpdateStream: The name of the ProgressUpdateStream.
    ///   - logger: Logger use during operation
    @inlinable
    public func listDiscoveredResources(
        maxResults: Int? = nil,
        migrationTaskName: String,
        nextToken: String? = nil,
        progressUpdateStream: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> ListDiscoveredResourcesResult {
        let input = ListDiscoveredResourcesRequest(
            maxResults: maxResults, 
            migrationTaskName: migrationTaskName, 
            nextToken: nextToken, 
            progressUpdateStream: progressUpdateStream
        )
        return try await self.listDiscoveredResources(input, logger: logger)
    }

    /// This is a paginated API that returns all the migration-task states for the specified MigrationTaskName and ProgressUpdateStream.
    @Sendable
    @inlinable
    public func listMigrationTaskUpdates(_ input: ListMigrationTaskUpdatesRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> ListMigrationTaskUpdatesResult {
        try await self.client.execute(
            operation: "ListMigrationTaskUpdates", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// This is a paginated API that returns all the migration-task states for the specified MigrationTaskName and ProgressUpdateStream.
    ///
    /// Parameters:
    ///   - maxResults: The maximum number of results to include in the response. If more results exist than the value that you specify here for MaxResults, the response will include a token that you can use to retrieve the next set of results.
    ///   - migrationTaskName: A unique identifier that references the migration task. Do not include sensitive data in this field.
    ///   - nextToken: If NextToken was returned by a previous call, there are more results available. The value of NextToken is a unique pagination token for each page. To retrieve the next page of results, specify the NextToken value that the previous call returned. Keep all other arguments unchanged. Each pagination token expires after 24 hours. Using an expired pagination token will return an HTTP 400 InvalidToken error.
    ///   - progressUpdateStream: The name of the progress-update stream, which is used for access control as well as a namespace for migration-task names that is implicitly linked to your AWS account. The progress-update stream must uniquely identify the migration tool as it is used for all updates made by the tool; however, it does not need to be unique for each AWS account because it is scoped to the AWS account.
    ///   - logger: Logger use during operation
    @inlinable
    public func listMigrationTaskUpdates(
        maxResults: Int? = nil,
        migrationTaskName: String,
        nextToken: String? = nil,
        progressUpdateStream: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> ListMigrationTaskUpdatesResult {
        let input = ListMigrationTaskUpdatesRequest(
            maxResults: maxResults, 
            migrationTaskName: migrationTaskName, 
            nextToken: nextToken, 
            progressUpdateStream: progressUpdateStream
        )
        return try await self.listMigrationTaskUpdates(input, logger: logger)
    }

    /// Lists all, or filtered by resource name, migration tasks associated with the user account making this call. This API has the following traits:   Can show a summary list of the most recent migration tasks.   Can show a summary list of migration tasks associated with a given discovered resource.   Lists migration tasks in a paginated interface.
    @Sendable
    @inlinable
    public func listMigrationTasks(_ input: ListMigrationTasksRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> ListMigrationTasksResult {
        try await self.client.execute(
            operation: "ListMigrationTasks", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Lists all, or filtered by resource name, migration tasks associated with the user account making this call. This API has the following traits:   Can show a summary list of the most recent migration tasks.   Can show a summary list of migration tasks associated with a given discovered resource.   Lists migration tasks in a paginated interface.
    ///
    /// Parameters:
    ///   - maxResults: Value to specify how many results are returned per page.
    ///   - nextToken: If a NextToken was returned by a previous call, there are more results available. To retrieve the next page of results, make the call again using the returned token in NextToken.
    ///   - resourceName: Filter migration tasks by discovered resource name.
    ///   - logger: Logger use during operation
    @inlinable
    public func listMigrationTasks(
        maxResults: Int? = nil,
        nextToken: String? = nil,
        resourceName: String? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> ListMigrationTasksResult {
        let input = ListMigrationTasksRequest(
            maxResults: maxResults, 
            nextToken: nextToken, 
            resourceName: resourceName
        )
        return try await self.listMigrationTasks(input, logger: logger)
    }

    /// Lists progress update streams associated with the user account making this call.
    @Sendable
    @inlinable
    public func listProgressUpdateStreams(_ input: ListProgressUpdateStreamsRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> ListProgressUpdateStreamsResult {
        try await self.client.execute(
            operation: "ListProgressUpdateStreams", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Lists progress update streams associated with the user account making this call.
    ///
    /// Parameters:
    ///   - maxResults: Filter to limit the maximum number of results to list per page.
    ///   - nextToken: If a NextToken was returned by a previous call, there are more results available. To retrieve the next page of results, make the call again using the returned token in NextToken.
    ///   - logger: Logger use during operation
    @inlinable
    public func listProgressUpdateStreams(
        maxResults: Int? = nil,
        nextToken: String? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> ListProgressUpdateStreamsResult {
        let input = ListProgressUpdateStreamsRequest(
            maxResults: maxResults, 
            nextToken: nextToken
        )
        return try await self.listProgressUpdateStreams(input, logger: logger)
    }

    /// Lists all the source resource that are associated with the specified MigrationTaskName and ProgressUpdateStream.
    @Sendable
    @inlinable
    public func listSourceResources(_ input: ListSourceResourcesRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> ListSourceResourcesResult {
        try await self.client.execute(
            operation: "ListSourceResources", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Lists all the source resource that are associated with the specified MigrationTaskName and ProgressUpdateStream.
    ///
    /// Parameters:
    ///   - maxResults: The maximum number of results to include in the response. If more results exist than the value that you specify here for MaxResults, the response will include a token that you can use to retrieve the next set of results.
    ///   - migrationTaskName: A unique identifier that references the migration task. Do not store confidential data in this field.
    ///   - nextToken: If NextToken was returned by a previous call, there are more results available. The value of NextToken is a unique pagination token for each page. To retrieve the next page of results, specify the NextToken value that the previous call returned. Keep all other arguments unchanged. Each pagination token expires after 24 hours. Using an expired pagination token will return an HTTP 400 InvalidToken error.
    ///   - progressUpdateStream: The name of the progress-update stream, which is used for access control as well as a namespace for migration-task names that is implicitly linked to your AWS account. The progress-update stream must uniquely identify the migration tool as it is used for all updates made by the tool; however, it does not need to be unique for each AWS account because it is scoped to the AWS account.
    ///   - logger: Logger use during operation
    @inlinable
    public func listSourceResources(
        maxResults: Int? = nil,
        migrationTaskName: String,
        nextToken: String? = nil,
        progressUpdateStream: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> ListSourceResourcesResult {
        let input = ListSourceResourcesRequest(
            maxResults: maxResults, 
            migrationTaskName: migrationTaskName, 
            nextToken: nextToken, 
            progressUpdateStream: progressUpdateStream
        )
        return try await self.listSourceResources(input, logger: logger)
    }

    /// Sets the migration state of an application. For a given application identified by the value passed to ApplicationId, its status is set or updated by passing one of three values to Status: NOT_STARTED | IN_PROGRESS | COMPLETED.
    @Sendable
    @inlinable
    public func notifyApplicationState(_ input: NotifyApplicationStateRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> NotifyApplicationStateResult {
        try await self.client.execute(
            operation: "NotifyApplicationState", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Sets the migration state of an application. For a given application identified by the value passed to ApplicationId, its status is set or updated by passing one of three values to Status: NOT_STARTED | IN_PROGRESS | COMPLETED.
    ///
    /// Parameters:
    ///   - applicationId: The configurationId in Application Discovery Service that uniquely identifies the grouped application.
    ///   - dryRun: Optional boolean flag to indicate whether any effect should take place. Used to test if the caller has permission to make the call.
    ///   - status: Status of the application - Not Started, In-Progress, Complete.
    ///   - updateDateTime: The timestamp when the application state changed.
    ///   - logger: Logger use during operation
    @inlinable
    public func notifyApplicationState(
        applicationId: String,
        dryRun: Bool? = nil,
        status: ApplicationStatus,
        updateDateTime: Date? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> NotifyApplicationStateResult {
        let input = NotifyApplicationStateRequest(
            applicationId: applicationId, 
            dryRun: dryRun, 
            status: status, 
            updateDateTime: updateDateTime
        )
        return try await self.notifyApplicationState(input, logger: logger)
    }

    /// Notifies Migration Hub of the current status, progress, or other detail regarding a migration task. This API has the following traits:   Migration tools will call the NotifyMigrationTaskState API to share the latest progress and status.    MigrationTaskName is used for addressing updates to the correct target.    ProgressUpdateStream is used for access control and to provide a namespace for each migration tool.
    @Sendable
    @inlinable
    public func notifyMigrationTaskState(_ input: NotifyMigrationTaskStateRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> NotifyMigrationTaskStateResult {
        try await self.client.execute(
            operation: "NotifyMigrationTaskState", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Notifies Migration Hub of the current status, progress, or other detail regarding a migration task. This API has the following traits:   Migration tools will call the NotifyMigrationTaskState API to share the latest progress and status.    MigrationTaskName is used for addressing updates to the correct target.    ProgressUpdateStream is used for access control and to provide a namespace for each migration tool.
    ///
    /// Parameters:
    ///   - dryRun: Optional boolean flag to indicate whether any effect should take place. Used to test if the caller has permission to make the call.
    ///   - migrationTaskName: Unique identifier that references the migration task. Do not store personal data in this field.
    ///   - nextUpdateSeconds: Number of seconds after the UpdateDateTime within which the Migration Hub can expect an update. If Migration Hub does not receive an update within the specified interval, then the migration task will be considered stale.
    ///   - progressUpdateStream: The name of the ProgressUpdateStream.
    ///   - task: Information about the task's progress and status.
    ///   - updateDateTime: The timestamp when the task was gathered.
    ///   - logger: Logger use during operation
    @inlinable
    public func notifyMigrationTaskState(
        dryRun: Bool? = nil,
        migrationTaskName: String,
        nextUpdateSeconds: Int = 0,
        progressUpdateStream: String,
        task: Task,
        updateDateTime: Date,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> NotifyMigrationTaskStateResult {
        let input = NotifyMigrationTaskStateRequest(
            dryRun: dryRun, 
            migrationTaskName: migrationTaskName, 
            nextUpdateSeconds: nextUpdateSeconds, 
            progressUpdateStream: progressUpdateStream, 
            task: task, 
            updateDateTime: updateDateTime
        )
        return try await self.notifyMigrationTaskState(input, logger: logger)
    }

    /// Provides identifying details of the resource being migrated so that it can be associated in the Application Discovery Service repository. This association occurs asynchronously after PutResourceAttributes returns.    Keep in mind that subsequent calls to PutResourceAttributes will override previously stored attributes. For example, if it is first called with a MAC address, but later, it is desired to add an IP address, it will then be required to call it with both the IP and MAC addresses to prevent overriding the MAC address.   Note the instructions regarding the special use case of the  ResourceAttributeList parameter when specifying any "VM" related value.     Because this is an asynchronous call, it will always return 200, whether an association occurs or not. To confirm if an association was found based on the provided details, call ListDiscoveredResources.
    @Sendable
    @inlinable
    public func putResourceAttributes(_ input: PutResourceAttributesRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> PutResourceAttributesResult {
        try await self.client.execute(
            operation: "PutResourceAttributes", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Provides identifying details of the resource being migrated so that it can be associated in the Application Discovery Service repository. This association occurs asynchronously after PutResourceAttributes returns.    Keep in mind that subsequent calls to PutResourceAttributes will override previously stored attributes. For example, if it is first called with a MAC address, but later, it is desired to add an IP address, it will then be required to call it with both the IP and MAC addresses to prevent overriding the MAC address.   Note the instructions regarding the special use case of the  ResourceAttributeList parameter when specifying any "VM" related value.     Because this is an asynchronous call, it will always return 200, whether an association occurs or not. To confirm if an association was found based on the provided details, call ListDiscoveredResources.
    ///
    /// Parameters:
    ///   - dryRun: Optional boolean flag to indicate whether any effect should take place. Used to test if the caller has permission to make the call.
    ///   - migrationTaskName: Unique identifier that references the migration task. Do not store personal data in this field.
    ///   - progressUpdateStream: The name of the ProgressUpdateStream.
    ///   - resourceAttributeList: Information about the resource that is being migrated. This data will be used to map the task to a resource in the Application Discovery Service repository.  Takes the object array of ResourceAttribute where the Type field is reserved for the following values: IPV4_ADDRESS | IPV6_ADDRESS | MAC_ADDRESS | FQDN | VM_MANAGER_ID | VM_MANAGED_OBJECT_REFERENCE | VM_NAME | VM_PATH | BIOS_ID | MOTHERBOARD_SERIAL_NUMBER where the identifying value can be a string up to 256 characters.     If any "VM" related value is set for a ResourceAttribute object, it is required that VM_MANAGER_ID, as a minimum, is always set. If VM_MANAGER_ID is not set, then all "VM" fields will be discarded and "VM" fields will not be used for matching the migration task to a server in Application Discovery Service repository. See the Example section below for a use case of specifying "VM" related values.   If a server you are trying to match has multiple IP or MAC addresses, you should provide as many as you know in separate type/value pairs passed to the ResourceAttributeList parameter to maximize the chances of matching.
    ///   - logger: Logger use during operation
    @inlinable
    public func putResourceAttributes(
        dryRun: Bool? = nil,
        migrationTaskName: String,
        progressUpdateStream: String,
        resourceAttributeList: [ResourceAttribute],
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> PutResourceAttributesResult {
        let input = PutResourceAttributesRequest(
            dryRun: dryRun, 
            migrationTaskName: migrationTaskName, 
            progressUpdateStream: progressUpdateStream, 
            resourceAttributeList: resourceAttributeList
        )
        return try await self.putResourceAttributes(input, logger: logger)
    }
}

extension MigrationHub {
    /// Initializer required by `AWSService.with(middlewares:timeout:byteBufferAllocator:options)`. You are not able to use this initializer directly as there are not public
    /// initializers for `AWSServiceConfig.Patch`. Please use `AWSService.with(middlewares:timeout:byteBufferAllocator:options)` instead.
    public init(from: MigrationHub, patch: AWSServiceConfig.Patch) {
        self.client = from.client
        self.config = from.config.with(patch: patch)
    }
}

// MARK: Paginators

@available(macOS 10.15, iOS 13.0, tvOS 13.0, watchOS 6.0, *)
extension MigrationHub {
    /// Return PaginatorSequence for operation ``listApplicationStates(_:logger:)``.
    ///
    /// - Parameters:
    ///   - input: Input for operation
    ///   - logger: Logger used for logging
    @inlinable
    public func listApplicationStatesPaginator(
        _ input: ListApplicationStatesRequest,
        logger: Logger = AWSClient.loggingDisabled
    ) -> AWSClient.PaginatorSequence<ListApplicationStatesRequest, ListApplicationStatesResult> {
        return .init(
            input: input,
            command: self.listApplicationStates,
            inputKey: \ListApplicationStatesRequest.nextToken,
            outputKey: \ListApplicationStatesResult.nextToken,
            logger: logger
        )
    }
    /// Return PaginatorSequence for operation ``listApplicationStates(_:logger:)``.
    ///
    /// - Parameters:
    ///   - applicationIds: The configurationIds from the Application Discovery Service that uniquely identifies your applications.
    ///   - maxResults: Maximum number of results to be returned per page.
    ///   - logger: Logger used for logging
    @inlinable
    public func listApplicationStatesPaginator(
        applicationIds: [String]? = nil,
        maxResults: Int? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) -> AWSClient.PaginatorSequence<ListApplicationStatesRequest, ListApplicationStatesResult> {
        let input = ListApplicationStatesRequest(
            applicationIds: applicationIds, 
            maxResults: maxResults
        )
        return self.listApplicationStatesPaginator(input, logger: logger)
    }

    /// Return PaginatorSequence for operation ``listCreatedArtifacts(_:logger:)``.
    ///
    /// - Parameters:
    ///   - input: Input for operation
    ///   - logger: Logger used for logging
    @inlinable
    public func listCreatedArtifactsPaginator(
        _ input: ListCreatedArtifactsRequest,
        logger: Logger = AWSClient.loggingDisabled
    ) -> AWSClient.PaginatorSequence<ListCreatedArtifactsRequest, ListCreatedArtifactsResult> {
        return .init(
            input: input,
            command: self.listCreatedArtifacts,
            inputKey: \ListCreatedArtifactsRequest.nextToken,
            outputKey: \ListCreatedArtifactsResult.nextToken,
            logger: logger
        )
    }
    /// Return PaginatorSequence for operation ``listCreatedArtifacts(_:logger:)``.
    ///
    /// - Parameters:
    ///   - maxResults: Maximum number of results to be returned per page.
    ///   - migrationTaskName: Unique identifier that references the migration task. Do not store personal data in this field.
    ///   - progressUpdateStream: The name of the ProgressUpdateStream.
    ///   - logger: Logger used for logging
    @inlinable
    public func listCreatedArtifactsPaginator(
        maxResults: Int? = nil,
        migrationTaskName: String,
        progressUpdateStream: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) -> AWSClient.PaginatorSequence<ListCreatedArtifactsRequest, ListCreatedArtifactsResult> {
        let input = ListCreatedArtifactsRequest(
            maxResults: maxResults, 
            migrationTaskName: migrationTaskName, 
            progressUpdateStream: progressUpdateStream
        )
        return self.listCreatedArtifactsPaginator(input, logger: logger)
    }

    /// Return PaginatorSequence for operation ``listDiscoveredResources(_:logger:)``.
    ///
    /// - Parameters:
    ///   - input: Input for operation
    ///   - logger: Logger used for logging
    @inlinable
    public func listDiscoveredResourcesPaginator(
        _ input: ListDiscoveredResourcesRequest,
        logger: Logger = AWSClient.loggingDisabled
    ) -> AWSClient.PaginatorSequence<ListDiscoveredResourcesRequest, ListDiscoveredResourcesResult> {
        return .init(
            input: input,
            command: self.listDiscoveredResources,
            inputKey: \ListDiscoveredResourcesRequest.nextToken,
            outputKey: \ListDiscoveredResourcesResult.nextToken,
            logger: logger
        )
    }
    /// Return PaginatorSequence for operation ``listDiscoveredResources(_:logger:)``.
    ///
    /// - Parameters:
    ///   - maxResults: The maximum number of results returned per page.
    ///   - migrationTaskName: The name of the MigrationTask. Do not store personal data in this field.
    ///   - progressUpdateStream: The name of the ProgressUpdateStream.
    ///   - logger: Logger used for logging
    @inlinable
    public func listDiscoveredResourcesPaginator(
        maxResults: Int? = nil,
        migrationTaskName: String,
        progressUpdateStream: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) -> AWSClient.PaginatorSequence<ListDiscoveredResourcesRequest, ListDiscoveredResourcesResult> {
        let input = ListDiscoveredResourcesRequest(
            maxResults: maxResults, 
            migrationTaskName: migrationTaskName, 
            progressUpdateStream: progressUpdateStream
        )
        return self.listDiscoveredResourcesPaginator(input, logger: logger)
    }

    /// Return PaginatorSequence for operation ``listMigrationTaskUpdates(_:logger:)``.
    ///
    /// - Parameters:
    ///   - input: Input for operation
    ///   - logger: Logger used for logging
    @inlinable
    public func listMigrationTaskUpdatesPaginator(
        _ input: ListMigrationTaskUpdatesRequest,
        logger: Logger = AWSClient.loggingDisabled
    ) -> AWSClient.PaginatorSequence<ListMigrationTaskUpdatesRequest, ListMigrationTaskUpdatesResult> {
        return .init(
            input: input,
            command: self.listMigrationTaskUpdates,
            inputKey: \ListMigrationTaskUpdatesRequest.nextToken,
            outputKey: \ListMigrationTaskUpdatesResult.nextToken,
            logger: logger
        )
    }
    /// Return PaginatorSequence for operation ``listMigrationTaskUpdates(_:logger:)``.
    ///
    /// - Parameters:
    ///   - maxResults: The maximum number of results to include in the response. If more results exist than the value that you specify here for MaxResults, the response will include a token that you can use to retrieve the next set of results.
    ///   - migrationTaskName: A unique identifier that references the migration task. Do not include sensitive data in this field.
    ///   - progressUpdateStream: The name of the progress-update stream, which is used for access control as well as a namespace for migration-task names that is implicitly linked to your AWS account. The progress-update stream must uniquely identify the migration tool as it is used for all updates made by the tool; however, it does not need to be unique for each AWS account because it is scoped to the AWS account.
    ///   - logger: Logger used for logging
    @inlinable
    public func listMigrationTaskUpdatesPaginator(
        maxResults: Int? = nil,
        migrationTaskName: String,
        progressUpdateStream: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) -> AWSClient.PaginatorSequence<ListMigrationTaskUpdatesRequest, ListMigrationTaskUpdatesResult> {
        let input = ListMigrationTaskUpdatesRequest(
            maxResults: maxResults, 
            migrationTaskName: migrationTaskName, 
            progressUpdateStream: progressUpdateStream
        )
        return self.listMigrationTaskUpdatesPaginator(input, logger: logger)
    }

    /// Return PaginatorSequence for operation ``listMigrationTasks(_:logger:)``.
    ///
    /// - Parameters:
    ///   - input: Input for operation
    ///   - logger: Logger used for logging
    @inlinable
    public func listMigrationTasksPaginator(
        _ input: ListMigrationTasksRequest,
        logger: Logger = AWSClient.loggingDisabled
    ) -> AWSClient.PaginatorSequence<ListMigrationTasksRequest, ListMigrationTasksResult> {
        return .init(
            input: input,
            command: self.listMigrationTasks,
            inputKey: \ListMigrationTasksRequest.nextToken,
            outputKey: \ListMigrationTasksResult.nextToken,
            logger: logger
        )
    }
    /// Return PaginatorSequence for operation ``listMigrationTasks(_:logger:)``.
    ///
    /// - Parameters:
    ///   - maxResults: Value to specify how many results are returned per page.
    ///   - resourceName: Filter migration tasks by discovered resource name.
    ///   - logger: Logger used for logging
    @inlinable
    public func listMigrationTasksPaginator(
        maxResults: Int? = nil,
        resourceName: String? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) -> AWSClient.PaginatorSequence<ListMigrationTasksRequest, ListMigrationTasksResult> {
        let input = ListMigrationTasksRequest(
            maxResults: maxResults, 
            resourceName: resourceName
        )
        return self.listMigrationTasksPaginator(input, logger: logger)
    }

    /// Return PaginatorSequence for operation ``listProgressUpdateStreams(_:logger:)``.
    ///
    /// - Parameters:
    ///   - input: Input for operation
    ///   - logger: Logger used for logging
    @inlinable
    public func listProgressUpdateStreamsPaginator(
        _ input: ListProgressUpdateStreamsRequest,
        logger: Logger = AWSClient.loggingDisabled
    ) -> AWSClient.PaginatorSequence<ListProgressUpdateStreamsRequest, ListProgressUpdateStreamsResult> {
        return .init(
            input: input,
            command: self.listProgressUpdateStreams,
            inputKey: \ListProgressUpdateStreamsRequest.nextToken,
            outputKey: \ListProgressUpdateStreamsResult.nextToken,
            logger: logger
        )
    }
    /// Return PaginatorSequence for operation ``listProgressUpdateStreams(_:logger:)``.
    ///
    /// - Parameters:
    ///   - maxResults: Filter to limit the maximum number of results to list per page.
    ///   - logger: Logger used for logging
    @inlinable
    public func listProgressUpdateStreamsPaginator(
        maxResults: Int? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) -> AWSClient.PaginatorSequence<ListProgressUpdateStreamsRequest, ListProgressUpdateStreamsResult> {
        let input = ListProgressUpdateStreamsRequest(
            maxResults: maxResults
        )
        return self.listProgressUpdateStreamsPaginator(input, logger: logger)
    }

    /// Return PaginatorSequence for operation ``listSourceResources(_:logger:)``.
    ///
    /// - Parameters:
    ///   - input: Input for operation
    ///   - logger: Logger used for logging
    @inlinable
    public func listSourceResourcesPaginator(
        _ input: ListSourceResourcesRequest,
        logger: Logger = AWSClient.loggingDisabled
    ) -> AWSClient.PaginatorSequence<ListSourceResourcesRequest, ListSourceResourcesResult> {
        return .init(
            input: input,
            command: self.listSourceResources,
            inputKey: \ListSourceResourcesRequest.nextToken,
            outputKey: \ListSourceResourcesResult.nextToken,
            logger: logger
        )
    }
    /// Return PaginatorSequence for operation ``listSourceResources(_:logger:)``.
    ///
    /// - Parameters:
    ///   - maxResults: The maximum number of results to include in the response. If more results exist than the value that you specify here for MaxResults, the response will include a token that you can use to retrieve the next set of results.
    ///   - migrationTaskName: A unique identifier that references the migration task. Do not store confidential data in this field.
    ///   - progressUpdateStream: The name of the progress-update stream, which is used for access control as well as a namespace for migration-task names that is implicitly linked to your AWS account. The progress-update stream must uniquely identify the migration tool as it is used for all updates made by the tool; however, it does not need to be unique for each AWS account because it is scoped to the AWS account.
    ///   - logger: Logger used for logging
    @inlinable
    public func listSourceResourcesPaginator(
        maxResults: Int? = nil,
        migrationTaskName: String,
        progressUpdateStream: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) -> AWSClient.PaginatorSequence<ListSourceResourcesRequest, ListSourceResourcesResult> {
        let input = ListSourceResourcesRequest(
            maxResults: maxResults, 
            migrationTaskName: migrationTaskName, 
            progressUpdateStream: progressUpdateStream
        )
        return self.listSourceResourcesPaginator(input, logger: logger)
    }
}

extension MigrationHub.ListApplicationStatesRequest: AWSPaginateToken {
    @inlinable
    public func usingPaginationToken(_ token: String) -> MigrationHub.ListApplicationStatesRequest {
        return .init(
            applicationIds: self.applicationIds,
            maxResults: self.maxResults,
            nextToken: token
        )
    }
}

extension MigrationHub.ListCreatedArtifactsRequest: AWSPaginateToken {
    @inlinable
    public func usingPaginationToken(_ token: String) -> MigrationHub.ListCreatedArtifactsRequest {
        return .init(
            maxResults: self.maxResults,
            migrationTaskName: self.migrationTaskName,
            nextToken: token,
            progressUpdateStream: self.progressUpdateStream
        )
    }
}

extension MigrationHub.ListDiscoveredResourcesRequest: AWSPaginateToken {
    @inlinable
    public func usingPaginationToken(_ token: String) -> MigrationHub.ListDiscoveredResourcesRequest {
        return .init(
            maxResults: self.maxResults,
            migrationTaskName: self.migrationTaskName,
            nextToken: token,
            progressUpdateStream: self.progressUpdateStream
        )
    }
}

extension MigrationHub.ListMigrationTaskUpdatesRequest: AWSPaginateToken {
    @inlinable
    public func usingPaginationToken(_ token: String) -> MigrationHub.ListMigrationTaskUpdatesRequest {
        return .init(
            maxResults: self.maxResults,
            migrationTaskName: self.migrationTaskName,
            nextToken: token,
            progressUpdateStream: self.progressUpdateStream
        )
    }
}

extension MigrationHub.ListMigrationTasksRequest: AWSPaginateToken {
    @inlinable
    public func usingPaginationToken(_ token: String) -> MigrationHub.ListMigrationTasksRequest {
        return .init(
            maxResults: self.maxResults,
            nextToken: token,
            resourceName: self.resourceName
        )
    }
}

extension MigrationHub.ListProgressUpdateStreamsRequest: AWSPaginateToken {
    @inlinable
    public func usingPaginationToken(_ token: String) -> MigrationHub.ListProgressUpdateStreamsRequest {
        return .init(
            maxResults: self.maxResults,
            nextToken: token
        )
    }
}

extension MigrationHub.ListSourceResourcesRequest: AWSPaginateToken {
    @inlinable
    public func usingPaginationToken(_ token: String) -> MigrationHub.ListSourceResourcesRequest {
        return .init(
            maxResults: self.maxResults,
            migrationTaskName: self.migrationTaskName,
            nextToken: token,
            progressUpdateStream: self.progressUpdateStream
        )
    }
}
